﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using vudu.Presentacion.Contrato.VU_16_Gestionar_Estudiante;
using vudu.Logica.Fachada;
using vudu.ClasesDominio;
using System.Text.RegularExpressions;


namespace vudu.Presentacion.Presentador.VU_16_Gestionar_Estudiante
{
    public class PresentadorConsultarEstudiante
    {
        //Variables para definir la vista y la fachada
        private IContratoConsultarEstudiante _vista;
        private EnlaceLogico _fachada;

        #region Variables y Constantes
        private System.Drawing.Color _colorMensajeError = System.Drawing.Color.Red;
        private System.Drawing.Color _colorMensajeExitoso = System.Drawing.Color.Green;
        private System.Drawing.Color _colorLabelBase = System.Drawing.Color.Black;
        private int num = 0;
        private int _longMaxExpediente = 6;
        private int _longMinCedula = 7;
        private int _longMaxCedula = 8;
        private Escuela escuela;
        private string operacionFallida = "Operación Fallida";
        private string transaccionFallida = "transaccionFallida";
        private string labelCedula = "Cedula:";
        private string labelExpediente = "Expediente:";
        private string siEsCedula = "1";
        private string siEsExpedient = "2";
        private string siEsSeleccion = "0";
        #endregion

        //Inicio la vista y la fachada
        public PresentadorConsultarEstudiante(IContratoConsultarEstudiante vista,EnlaceLogico fachada)
        {
            _vista = vista;
            _fachada = fachada;
            escuela = (Escuela)fachada.RolActual;
        }

        //Inicializo lo que saldra por pantalla, los labes de los mensajes
        public void InicioPantalla()
        {
            _vista.saludo.Text = "Consultar Estudiante";
            _vista.escuelaNombre.Text = escuela.NombreEscuela;
            _vista.expediente.Visible = false;
            _vista.nombre.Visible = false;
            _vista.apellido.Visible = false;
            _vista.identificacion.Visible = false;
            _vista.nacionalidad.Visible = false;
            _vista.sexo.Visible = false;
            _vista.numexp.Visible = false;
            _vista.fecha.Visible = false;
            _vista.correo.Visible = false;
            _vista.telefono1.Visible = false;
            _vista.busqueda.Visible = false;
        }


        /// <summary>
        /// Procedimiento para realizar la busqueda sea por cedula o expediente.
        /// </sum
        public void ValidarBusqueda()
        {
            String bus = _vista.buscar.SelectedValue;
            this.ActivarDesactivarCampos(false);
            _vista.cedula.ForeColor = _colorLabelBase;
            _vista.expediente.ForeColor = _colorLabelBase;
            _vista.mensajeTransaccion.Visible = false;

            if (bus.Equals(siEsCedula))
            {
                _vista.cedula.Visible = true;
                _vista.cedula.Text = labelCedula;
                _vista.expediente.Visible = false;
                _vista.busqueda.Visible = true;
            }
            if (bus.Equals(siEsExpedient))
            {
                _vista.expediente.Visible = true;
                _vista.expediente.Text = labelExpediente;
                _vista.cedula.Visible = false;
                _vista.busqueda.Visible = true;
            }
            if (bus.Equals(siEsSeleccion))
            {
                _vista.expediente.Visible = false;
                _vista.cedula.Visible = false;
                _vista.busqueda.Visible = false;
            }
        }

        /// <summary>
        /// Funcion que valida si la cedula es correcta.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidaCedula(string cedula)
        {
            bool esValido = false;
            esValido = int.TryParse(cedula, out num);
            if (!esValido)  /// solo numeros
            {
                _vista.mensajeTransaccion.Text = operacionFallida;
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                _vista.cedula.ForeColor = _colorMensajeError;
                return false;
            }
            else if ((cedula.Length < _longMinCedula) || (cedula.Length > _longMaxCedula))  /// mayor que 7 y menor que 8
            {
                _vista.mensajeTransaccion.Text = operacionFallida;
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                _vista.cedula.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que valida si exite un numero de expediente igual en la escuela.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidaExpediente(string cedula)
        {
            bool esValido = false;
            esValido = int.TryParse(cedula, out num);
            if (!esValido)  /// solo numeros
            {
                _vista.mensajeTransaccion.Text = operacionFallida;
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                _vista.expediente.ForeColor = _colorMensajeError;
                return false;
            }
            else if ((cedula.Length > _longMaxExpediente))  /// menor que 6
            {
                _vista.mensajeTransaccion.Text = operacionFallida;
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                _vista.expediente.ForeColor = _colorMensajeError;
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funcion que valida si el campo de la cedula es vacio.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCamposCedula()
        {
            bool val1 = true;

            val1 = this.ValidaCedula(_vista.busqueda.Text);
            if (_vista.busqueda.Text == "") 
            {
                _vista.mensajeTransaccion.Text = operacionFallida;
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                _vista.cedula.ForeColor = _colorMensajeError;
                val1 = false;
            }
            if ((val1 == true))
                return true;
            else
                return false;
        }

        /// <summary>
        /// Funcion que valida si el campo del expediente es vacio.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCamposExpediente()
        {
            bool val1 = true;

            val1 = this.ValidaExpediente(_vista.busqueda.Text);
            if (_vista.busqueda.Text == "")  
            {
                _vista.mensajeTransaccion.Text = operacionFallida;
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                _vista.expediente.ForeColor = _colorMensajeError;
                val1 = false;
            }
            if ((val1 == true))
                return true;
            else
                return false;
        }

        /// <summary>
        /// Procedimiento donde se realiza el tipo de consulta sea por cedula o expediente.
        /// </summary>
        public void RealizarOperacionDeBusqueda()
        {
            _vista.cedula.ForeColor = _colorLabelBase;
            _vista.expediente.ForeColor = _colorLabelBase;
            _vista.mensajeTransaccion.Visible = false;
           string busqueda = _vista.buscar.SelectedValue;
           if (busqueda.Equals(siEsCedula))
           {
               this.BuscarPorCedula();
           }
           if (busqueda.Equals(siEsExpedient))
           {
               this.BuscarPorExpediente();
           }
        }

        /// <summary>
        /// Funcion que valida si exite un numero de expediente igual en la escuela.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarExpedienteEnBD(string expediente, int escuela)
        {
            return _fachada.verificarExpedienteEstudianteAgregar(expediente, escuela);
        }

        /// <summary>
        /// Procedimiento para hacer la consulta por el numero de Cedula.
        /// </sum
        public void BuscarPorCedula()
        {
            
            int cedula = int.Parse(_vista.busqueda.Text);
            if ((this.ValidarCamposCedula() == true) && (_fachada.verificarCedulaEstudianteAgregar(cedula) == true))
            {
                Estudiante miEstudiante = _fachada.BuscarEstudianteCedula(cedula, escuela.IdEscuela);
                _vista.nombre.Text = miEstudiante.Nombre;
                _vista.apellido.Text = miEstudiante.Apellido;
                _vista.nacionalidad.Text = miEstudiante.nacionalidad + "-";
                _vista.identificacion.Text = miEstudiante.Cedula.ToString();
                _vista.sexo.Text = miEstudiante.Sexo;
                _vista.numexp.Text = miEstudiante.Expediente;
                _vista.fecha.Text = miEstudiante.FechaNacimiento.ToShortDateString().ToString();
                _vista.correo.Text = miEstudiante.Correo;
                _vista.telefono1.Text = miEstudiante.Telefono;
                this.ActivarDesactivarCampos(true);
            }
            else
            {
                _vista.mensajeTransaccion.Text = operacionFallida + " Cedula no Registrada en Escuela";
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                this.ActivarDesactivarCampos(false);
            }

        }

        /// <summary>
        /// Procedimiento para hacer la consulta por el numero de Expediente.
        /// </sum
        public void BuscarPorExpediente()
        {

            if ((this.ValidarCamposExpediente() == true) && (this.ValidarExpedienteEnBD(_vista.busqueda.Text, escuela.IdEscuela) == true))
            {
                int expediente = int.Parse(_vista.busqueda.Text);
                Estudiante miEstudiante = _fachada.BuscarEstudianteExpediente(expediente, escuela.IdEscuela);
                _vista.nombre.Text = miEstudiante.Nombre;
                _vista.apellido.Text = miEstudiante.Apellido;
                _vista.nacionalidad.Text = miEstudiante.nacionalidad + "-";
                _vista.identificacion.Text = miEstudiante.Cedula.ToString();
                _vista.sexo.Text = miEstudiante.Sexo;
                _vista.numexp.Text = miEstudiante.Expediente;
                _vista.fecha.Text = miEstudiante.FechaNacimiento.ToShortDateString().ToString();
                _vista.correo.Text = miEstudiante.Correo;
                _vista.telefono1.Text = miEstudiante.Telefono;
                this.ActivarDesactivarCampos(true);

            }
            else
            {
                _vista.mensajeTransaccion.Text = operacionFallida + " Expediente no Registrado en Escuela";
                _vista.mensajeTransaccion.CssClass = transaccionFallida;
                _vista.mensajeTransaccion.Visible = true;
                this.ActivarDesactivarCampos(false);
            }

        }

        /// <summary>
        /// Procedimiento para activar y desactivar los label de la vista.
        /// </sum
        public void ActivarDesactivarCampos(bool respuesta)
        {
            _vista.nombre.Visible = respuesta;
            _vista.apellido.Visible = respuesta;
            _vista.nacionalidad.Visible = respuesta;
            _vista.identificacion.Visible = respuesta;
            _vista.sexo.Visible = respuesta;
            _vista.numexp.Visible = respuesta;
            _vista.fecha.Visible = respuesta;
            _vista.correo.Visible = respuesta;
            _vista.telefono1.Visible = respuesta;
        }

    }
}